#include <iostream>
#include <string>
#include <regex>

using namespace std;

bool valid(const smatch& m)
{
    // 如果区号前有一个左括号
    if (m[1].matched)
        // 则区号后必须有一个右括号，之后紧跟剩余号码或一个空格
        return m[3].matched
                && (m[4].matched == 0 || m[4].str() == " ");
    else
        // 否则，区号后不能有右括号
        // 另两个组成部分间的分隔符必须匹配
        return !m[3].matched
                && m[4].str() == m[6].str();
}

int main()
{
    string filename = "main.cpp";
    smatch results;
    /**
     * 子表达式
     * ([[:alnum:]]+)   表示文件名，匹配一个或多个字符的序列
     * (cpp|cxx|cc)     表示文件拓展名
     */
    regex r("([[:alnum:]]+)\\.(cpp|cxx|cc)$", regex::icase);
    if (regex_search(filename, results, r))
        // str(0) - main.cpp   str(1) - main   str(2) - cpp
        cout << results.str(1) << endl; // 打印第一个子表达式匹配的结果

    /**
     * 如果 pattern 有 n 个子表达式，则 smatch 包含 n + 1 个 ssub_match 元素
     * 位置 [0] 的元素表示整个匹配；元素 [1]...[n] 表示每个对应的子表达式
     */

    string phone = "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ]?)(\\d{4})";
    regex reg(phone);
    smatch m;
    string s;
    // 读取每条记录
    while (getline(cin, s)) {
        // 对每个匹配的电话号码，比如 (027)-123-4567
        for (sregex_iterator it(s.begin(), s.end(), reg), end_it;
                    it != end_it; ++it)
            // 检查号码的格式是否合法
            if (valid(*it))
                cout << "valid: " << it->str() << endl;
            else
                cout << "not valid: " << it->str() << endl;
    }
}